using GamFi.Admin.API.Application.Contracts.Image.GetImages;
using GamFi.Admin.API.Application.Exceptions;
using GamFi.Admin.API.Application.Interfaces;
using GamFi.Admin.API.Application.Resources;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;

namespace GamFi.Admin.API.Application.Features.Queries.Image.GetImages;

/// <summary>
/// Обработчик запроса на получение списка изображений с учетом пагинации.
/// </summary>
public class GetImagesQueryHandler : IRequestHandler<GetImagesQuery, GetImagesResponse>
{
    private readonly IDbContext _dbContext;
    private readonly IStringLocalizer<ExceptionMessages> _localizer;

    /// <summary>
    /// Инициализирует новый экземпляр обработчика запроса на получение списка изображений с учетом пагинации.
    /// </summary>
    /// <param name="dbContext">Контекст базы данных.</param>
    /// <param name="localizer">Локализатор исключений.</param>
    public GetImagesQueryHandler(IDbContext dbContext,
        IStringLocalizer<ExceptionMessages> localizer)
    {
        _dbContext = dbContext;
        _localizer = localizer;
    }

    public async Task<GetImagesResponse> Handle(GetImagesQuery request, CancellationToken cancellationToken)
    {
        // Проверяем, не является ли запрос пустым
        if (request == null)
            throw new RequestException(_localizer[nameof(RequestException.RequestIsEmpty)]);

        // Получаем изображения из базы данных с учетом пагинации
        IQueryable<Domain.Entities.Image> query = _dbContext.Images;

        // Применяем фильтр, если он предоставлен
        if (!string.IsNullOrEmpty(request.Filter))
        {
            query = query.Where(image => 
                image.ImageName!.Contains(request.Filter) || 
                image.Address.Contains(request.Filter) ||
                image.Id.ToString().Contains(request.Filter) ||
                image.Size.ToString().Contains(request.Filter));
        }

        var imagesIds = await query
            .Skip((request.PageNumber - 1) * request.PageSize)
            .Take(request.PageSize)
            .Select(i => i.Id)
            .ToListAsync(cancellationToken);

        // Возвращаем ответ, содержащий список изображений
        return new GetImagesResponse { ImagesIds = imagesIds };
    }
}